package logica_de_presentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import comun.Imagen;
import comun.Usuario;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.gestorImagen;
import logica_de_negocio.gestorUsuario;


public class TablaImagenes extends JInternalFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JTable tablaDatos;
	private JButton jbElegir,jbDetalles,jbBorrar, jbSalir;
	private JScrollPane scrollPane;
	private JPanel jpBotones;
	private HashSet<Imagen> lisIm;
	private MenuInicial clasePadre;
	private Usuario usuActual;
	
	private int id_i=0;

	public TablaImagenes(MenuInicial clasePadre, Usuario usuActual) {

		super("Imagenes", true, false, false, false);
		this.setVisible(true);
		this.clasePadre=clasePadre;
		this.setSize(900, 700);
		this.usuActual=usuActual;
		this.subCompo();

	}

	public void subCompo() {

		this.getContentPane().setLayout(new BorderLayout());
		// TABLA
		// CREAMOS UN SCROLLPANE Y LE ANADIMOS LA TABLA
		scrollPane = new JScrollPane(tablaDatos);

		// ANADIMOS EL SCROLLPANE AL PANEL
		this.add(scrollPane, "Center");

		jpBotones = new JPanel(new FlowLayout());

		jbDetalles = new JButton("Ver imagen");
		jbDetalles.addActionListener(this);
		jbDetalles.setMnemonic(KeyEvent.VK_V);
		jbDetalles.setToolTipText("Ver Imagen");
		jpBotones.add(jbDetalles);
		
		jbElegir = new JButton("Elegir");
		jbElegir.addActionListener(this);
		jbElegir.setMnemonic(KeyEvent.VK_V);
		jbElegir.setToolTipText("Elegir imagen");
		jpBotones.add(jbElegir);
		if(usuActual.isEsAdmin()){
			jbBorrar = new JButton("Borrar");
			jbBorrar.addActionListener(this);
			jbBorrar.setMnemonic(KeyEvent.VK_B);
			jbBorrar.setToolTipText("Borrar Imagen");
			jpBotones.add(jbBorrar);
		}
		
		jbSalir = new JButton("Salir");
		jbSalir.addActionListener(this);
		jbSalir.setMnemonic(KeyEvent.VK_S);
		jbSalir.setToolTipText("Salir  de la tabla");
		jpBotones.add(jbSalir);

		this.getContentPane().add(jpBotones, "South");

	}
	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsado = (JButton) e.getSource();

		if (botonPulsado == jbSalir) {
			this.dispose();
		}
		if ((botonPulsado == jbDetalles)|(botonPulsado==jbElegir)) {
			
			
			try {
				int id = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				gestorImagen gi = new gestorImagen();
				Imagen i=gi.getImagenFromId(id);
				if(botonPulsado==jbDetalles){
					
					VerImagen vi = new VerImagen();
					vi.cargarImagen(i);
					vi.toFront();
					clasePadre.add(vi);
				}else{
					id_i=i.getId();
					this.dispose();
				}
				
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No existe la base de datos.");
			} catch (IOException e1) {
				//No se da al leer solo al escribir.
			}
		}
		if(botonPulsado==jbBorrar){
			try {
				int id = (int) tablaDatos.getValueAt(
						tablaDatos.getSelectedRow(), 0);
				gestorImagen gi = new gestorImagen();
				Imagen i=gi.getImagenFromId(id);
				gestorUsuario gu=new gestorUsuario();
				gu.imagenBorrada(i.getId());
				boolean esta=gu.isId_i(i.getId());
				if(esta){
					JOptionPane.showMessageDialog(new Frame(),
							"No se ha borrado bien");
				}else{
					if(gi.borrar(i.getId())){
						JOptionPane.showMessageDialog(new Frame(),
								"Se ha borrado con exito");
					}
				}
				this.refreshTable();
			} catch (IndexOutOfBoundsException sinEle) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay niguna fila selecionada");
			} catch (ClassNotFoundException e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No existe la base de datos.");
				this.dispose();
			} catch (FaltanDatosEnLaBaseDeDatos e1) {
				JOptionPane.showMessageDialog(new Frame(),
						"No hay informacion en la base de datos");
				this.dispose();
			}
		}
	
	}
	
	private void refreshTable() throws ClassNotFoundException, FaltanDatosEnLaBaseDeDatos {
		gestorImagen gi = new gestorImagen();
		lisIm = gi.getImganes();
		myTable tpm = (myTable) tablaDatos.getModel();
		tpm.setData();
		tpm.fireTableDataChanged();
	}

	public void cargar() {

		gestorImagen gi = new gestorImagen();

		try {
			lisIm = gi.getImganes();
		} catch (FaltanDatosEnLaBaseDeDatos e) {
			JOptionPane.showMessageDialog(new Frame(), e.getFalta());
			this.dispose();
		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(new Frame(),
					"No existe la base de datos.");
			this.dispose();

		}
		crearTabla();
		this.setVisible(true);
		this.subCompo();
	}

	public void crearTabla() {

		tablaDatos = null;// VACIAMOS SI EXISTE ALUGUNA
		myTable tmp = new myTable();
		tablaDatos = new JTable(tmp);
		tablaDatos.setPreferredScrollableViewportSize(new Dimension(200, 200));
		tablaDatos.setEnabled(true);
		// QUE PODAMOS SELECIONAR LAS FILAS
		tablaDatos.setRowSelectionAllowed(true);
		// QUE SE ACTUALICE (La tabla que contiene)
		tmp.fireTableDataChanged();
		// SI QUEREMOS QUE LA TABLA LLENE POR COMPLETO LA VENTANA EN LA ALTURA
		tablaDatos.setFillsViewportHeight(true);
		// CREAR UNA ORDENACION AUTOMATICA
		tablaDatos.setAutoCreateRowSorter(true);

	}

	class myTable extends AbstractTableModel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private String[] columName = { "Id", "nombre" };;
		private Object[][] data;

		public myTable() {

			super();
			setData();
		}
		@Override
		public int getColumnCount() {
			return columName.length;
		}
		@Override
		public int getRowCount() {
			return data.length;
		}
		@Override
		public String getColumnName(int col) {
			return columName[col];
		}
		@Override
		public Object getValueAt(int row, int col) {

			return data[row][col];
		}

		public void setData() {

			data = new Object[lisIm.size()][];
			int cont = 0;
			for (Imagen i : lisIm) {

				Object[] a = { i.getId(), i.getNombre() };
				data[cont] = a;
				cont++;

			}
		}
	}
	
	public int getId_i(){
		return id_i;
	}
}
